#include "Collision.h"
#include "Globals.h" // 访问 player, enemies, bullets, images
#include <math.h>    // 用于 sqrt (或仅使用平方距离)
#include <stdio.h>   // 用于 printf 调试

// 玩家子弹 vs 敌人 (圆形碰撞检测)
void check_player_bullets() {
    for (int i = 0; i < MAX_BULLETS; i++) {
        if (bullets[i].active && bullets[i].owner == 0) { // 是玩家的活动子弹
            for (int j = 0; j < MAX_TOTAL_ENEMIES; j++) {
                if (enemies[j].isActive) { // 只检测活动的敌人
                     // 对敌机图片数据进行基本验证
                     if (enemies[j].num < 0 || enemies[j].num >= MAX_ENEMY_IMAGES || image_Enemy[enemies[j].num].getwidth() == 0) continue; // 修正: 使用成员函数

                    // 敌机碰撞参数
                    float enemyWidth = image_Enemy[enemies[j].num].getwidth();  // 修正
                    float enemyHeight = image_Enemy[enemies[j].num].getheight(); // 修正
                    float enemyCenterX = enemies[j].x + enemyWidth / 2.0f;
                    float enemyCenterY = enemies[j].y + enemyHeight / 2.0f;
                    // 碰撞半径取宽高较小值的一半，再乘以系数缩小判定范围
                    float enemyRadius = (min(enemyWidth, enemyHeight) / 2.0f) * 0.8f; // 调整系数以改变灵敏度
                    float enemyRadiusSq = enemyRadius * enemyRadius; // 半径的平方

                    // 子弹属性 (为简化，视子弹为点)
                    float bulletX = bullets[i].x;
                    float bulletY = bullets[i].y;

                    // 计算子弹与敌机中心的距离平方
                    float dx = bulletX - enemyCenterX;
                    float dy = bulletY - enemyCenterY;
                    float distSq = dx * dx + dy * dy;

                    // 如果距离平方 < 敌机半径平方，则碰撞
                    if (distSq < enemyRadiusSq) {
                        // 发生碰撞!
                        // printf("碰撞: 玩家子弹 %d 击中敌机 %d\n", i, j); // 调试信息
                        enemies[j].hp -= bullets[i].attack_power; // 减少敌机 HP
                        bullets[i].active = false; // 子弹消失

                        // 敌机被摧毁和得分逻辑在 update_enemies 中处理 (当 hp <= 0 时)
                        break; // 一颗子弹击中一个目标后就消失，不再检测其他敌机
                    }
                }
            }
        }
    }
}

// 敌人子弹 vs 玩家 (圆形碰撞检测)
void check_enemy_bullets() {
     // 对玩家图片数据进行基本验证
     if (image_Plane[0].getwidth() == 0) return; // 修正

    // 玩家碰撞参数
    float playerWidth = image_Plane[0].getwidth();  // 修正
    float playerHeight = image_Plane[0].getheight(); // 修正
    // 玩家碰撞半径也缩小一点
    float playerRadius = (min(playerWidth, playerHeight) / 2.0f) * 0.7f; // 调整系数
    float playerRadiusSq = playerRadius * playerRadius; // 半径平方
    float playerCenterX = player.x; // 玩家坐标即中心
    float playerCenterY = player.y;


    for (int i = 0; i < MAX_BULLETS; i++) {
        if (bullets[i].active && bullets[i].owner == 1) { // 是敌人的活动子弹
            // 子弹坐标 (视为点)
            float bulletX = bullets[i].x;
            float bulletY = bullets[i].y;

            // 计算子弹与玩家中心的距离平方
            float dx = bulletX - playerCenterX;
            float dy = bulletY - playerCenterY;
            float distSq = dx * dx + dy * dy;

            // 如果距离平方 < 玩家半径平方，则碰撞
            if (distSq < playerRadiusSq) {
                // 发生碰撞!
                // printf("碰撞: 敌人子弹 %d 击中玩家\n", i);
                // 如果实现了无敌状态，在此处检查
                // if (!player.isInvincible) {
                    player.hp -= bullets[i].attack_power; // 减少玩家 HP
                    // printf("  玩家 HP: %d\n", player.hp);
                    // player.isInvincible = true; // 设置无敌状态
                    // player.invincibleTimer = GetTickCount64(); // 开始无敌计时
                // }
                 if (player.hp < 0) player.hp = 0; // 防止 HP 显示为负数
                bullets[i].active = false; // 子弹消失

                // 玩家死亡检查在 gameView 循环中进行
            }
        }
    }
}

// 玩家 vs 敌人 (圆形碰撞检测)
void check_player_enemy_collision() {
     // 对玩家图片数据进行基本验证
     if (image_Plane[0].getwidth() == 0) return; // 修正

    // 玩家碰撞参数
    float playerWidth = image_Plane[0].getwidth();  // 修正
    float playerHeight = image_Plane[0].getheight(); // 修正
    float playerCenterX = player.x; // 玩家坐标即中心
    float playerCenterY = player.y;
    float playerRadius = (min(playerWidth, playerHeight) / 2.0f) * 0.7f; // 调整系数以缩小判定区

    // 遍历所有敌机槽位
    for (int i = 0; i < MAX_TOTAL_ENEMIES; i++) {
        if (enemies[i].isActive) { // 只检测活动的敌机
            // 对敌机图片数据进行基本验证
            if (enemies[i].num < 0 || enemies[i].num >= MAX_ENEMY_IMAGES || image_Enemy[enemies[i].num].getwidth() == 0) continue; // 修正

            // 敌机碰撞参数
            float enemyWidth = image_Enemy[enemies[i].num].getwidth();  // 修正
            float enemyHeight = image_Enemy[enemies[i].num].getheight(); // 修正
            float enemyCenterX = enemies[i].x + enemyWidth / 2.0f;  // 敌机中心 X
            float enemyCenterY = enemies[i].y + enemyHeight / 2.0f; // 敌机中心 Y
            float enemyRadius = (min(enemyWidth, enemyHeight) / 2.0f) * 0.7f; // 调整系数

            // 计算两个圆心之间的距离平方
            float dx = playerCenterX - enemyCenterX;
            float dy = playerCenterY - enemyCenterY;
            float distSq = dx * dx + dy * dy;

            // 计算半径和的平方
            float radiiSum = playerRadius + enemyRadius;
            float radiiSumSq = radiiSum * radiiSum;

            // 如果距离平方 < 半径和的平方，则发生碰撞
            if (distSq < radiiSumSq) {
                // 发生碰撞!
                // printf("碰撞: 玩家与敌机 %d (类型: %d)\n", i, enemies[i].type);

                // 减少玩家 HP (检查无敌状态?)
                 // if (!player.isInvincible) {
                     // 追踪型(Type 3)造成更高伤害
                     int damage = (enemies[i].type == 3) ? 30 : 15; // 稍微增加普通碰撞伤害
                     player.hp -= damage;
                     if (player.hp < 0) player.hp = 0; // 防止负 HP
                     // printf("  玩家 HP: %d\n", player.hp);
                    // player.isInvincible = true; // 设置无敌
                    // player.invincibleTimer = GetTickCount64(); // 开始计时
                 // }

                // 碰撞后立即摧毁敌机
                enemies[i].isActive = false; // 设为非活动
                activeEnemies--;             // 减少活动计数
                enemyShootTimer[i] = 0;      // 重置此槽位射击计时器
                 // TODO: 在此位置触发爆炸效果

                 // 玩家死亡检查在 gameView 循环中进行
                 // 不 break，允许玩家在一帧内与多个重叠的敌机碰撞并受到伤害
            }
        }
    }
}